{ Datos comunes
  Esta unidad contiene los datos comues, para todo el programa, así como
  procedimiento y funciones generales.

  Copyright (C) 2010 Jorge Turiel jorgeturiel@gmail.com

  This source is free software; you can redistribute it and/or modify it under
  the terms of the GNU General Public License as published by the Free
  Software Foundation; either version 2 of the License, or (at your option)
  any later version.

  This code is distributed in the hope that it will be useful, but WITHOUT ANY
  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  details.

  A copy of the GNU General Public License is available on the World Wide Web
  at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
  to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  MA 02111-1307, USA.
}
unit ucomun;

{$mode objfpc}{$H+}

interface
uses
  Classes, SysUtils, Contnrs,ComCtrls,Dialogs,
  XMLRead,DOM,Controls, //Aquí está definido alClient
  uSolucion;

{ Tipos enumerados de las posibles categorias de los mensajes }
Type  Categoria = (General,Compilador,Editor);
{ Registro que contiene la posición de una ventana }

Type TPosVentana = Record
     Arriba  :Integer;
     Izquierda : Integer;
     Alto : Integer;
     Ancho : Integer;
end;

  { Constantes de uso del programa}
Const
    SinNombre :string = 'Solucion sin nombre'; //Texto del raiz cuando no hay solución cargada
    { Nombre del fichero de las placas en el directorio Arduino }
    BoardsArduino : string = 'Boards.txt';
    { Nombre del fichero que guarda la configuración de los placas }
    Boards : string = 'Boards.xml';
    { Fichero principal}
    Main : string = 'Main';
    NombreApp : String = 'IdeArduino';

Var
   { Nombre de la solución actual }
     NombreSolucion : String;

     ListaProyectos : TObjectList; //Crear la lista de objetos
     nTabSheet : LongInt; //Contiene el número de TabSheet Creadas
     ProyectoActual : String; //Contiene el proyecto que se debe compilar
     LimiteSuperior : Integer; //Contiene la posicion en altura, dónde se situaran los otros formularios
     {Variables posicion de la ventana editor}
     EditorPos : TPosVentana;
     {Variable posicion de la ventana Explorador}
     ExploradorPos : TPosVentana;
     {Variable posición de la ventana de mensajes}
     MensajesPos : TPosVentana;
     {Directorio de archivo de datos}
     Datos : String;
     {Ruta dónde está la instalación de Arduino, en el este directorio se
      important y leen datos}
      Arduino : String;
      { Ancho columna del ListView de Crear Proyecto }
      AnchoCol : Integer;


      {Contiene el directorio para los datos del usuario, en windows7
      c:\users\user\programa }
      dirUsuario : String;

      {Directorio temporal para la compilación de los proyectos Arduino }
      dirTemp : String;

       PuertosSerie : TStringList;
{Devuelve la lista de puertos serie disponibles en el sistema.
  Solo en Windows}
Procedure ListaPuertosSerie (Var Lista : TStringList);

{ Actualiza el explorador de solución, usando los datos contenidos en la clase
  TSolución }
Procedure ActualizaExplorador;

{ Muesta un mensaje en la ventana de Mensajes }
Procedure MuestraMensaje (aCategoria : Categoria; Texto : String);

{ Devuelve la categoria en formato texto }
Function CategoriaToStr (aCategoria : Categoria):String;
{ Recibe un cadena, y vuelve un TStrinList, con las palabras que haya en la
  cadena separadas por espacios}

function CadenaPartes(aTexto: String): TStringList;
implementation
uses uControlesComun,uExploraSolucion,umain, synaser;

function CadenaPartes(aTexto: String): TStringList;
var
  Palabras: TStringList;
  Cadena: String;
  P: SizeInt;
  SubCadena: String;
begin
  Palabras := TStringList.Create;
  Palabras.Clear;
  Cadena := Trim (aTexto);
  //comprobar si solo hay una palabra
  P := Pos (' ', Cadena);
  If P = 0 Then
  Begin
    Palabras.Add (Cadena);
    Result := Palabras;
    Exit;
  end;

  While Length(Cadena) > 0 do
  Begin
    P := Pos (' ',Cadena);
    If P > 0 Then
    Begin
     SubCadena := Copy (Cadena,0,P);
     Palabras.Add (SubCadena);
     Cadena:= Trim (Copy (Cadena,P,Length(Cadena)));
    end
    Else
    Begin
      Palabras.Add (Cadena);
      SetLength(Cadena,0);
    end;
  end;
Result := Palabras;
end;
procedure ListaPuertosSerie(var Lista: TStringList);
var
  Cadena: String;
begin
  Cadena := GetSerialPortNames;
  Lista.Clear;
  Lista := CadenaPartes(Cadena);
end;

procedure ActualizaExplorador;
var
  Nombre: String;
  I: Integer;
  NodoRaiz,
  NodoHijo: TTreeNode;
 // Registro: TProyecto;
  J: Integer;
 // Ficheros: TFichero;
  NodoFichero: TTreeNode;
begin
  If Solucion = nil Then
  Begin
    Nombre := SinNombre;
  end
  Else
  Begin
    Nombre := Solucion.nombre;
  end;
  Nombre := 'Solución: '+Nombre;
  With frMain.frExplorador do
  Begin
   TreeView1.Items.Clear;
    NodoRaiz := TreeView1.Items.AddChild(Nil,Nombre);
    NodoRaiz.ImageIndex:=2;
    NodoRaiz.SelectedIndex:=2;


  For I := 0 To Solucion.Contar-1 do
  Begin
     // Registro := TProyecto.Create('','',-1);
     // Registro := Solucion.Proyectos[i];
      NodoHijo := TreeView1.Items.AddChild(NodoRaiz,Solucion.Proyectos[i].Nombre);
      NodoHijo.ImageIndex:=1;
      NodoHijo.SelectedIndex:=1;
      For J := 0 To Solucion.Proyectos[i].Contar-1 do
      Begin
          //Ficheros := Solucion.Proyectos[i].Ficheros[j];
          NodoFichero :=TreeView1.Items.AddChild(NodoHijo,Solucion.Proyectos[i].Ficheros[j].Nombre);
          NodoFichero.ImageIndex:=0;
          NodoFichero.SelectedIndex:=0;
      end;
    ;
  end;
  end;

end;

procedure MuestraMensaje (aCategoria :Categoria ; Texto :String );
Var
   MiItem : TListItem;
begin
 With  frMain do
 Begin
  IF frMensajes = nil Then Exit; //sino está disponible salir
 end;
 With frMain.frMensajes do
 Begin
   MiItem := TListItem.Create(lsvMensajes.items);
   MiItem.Caption := DateToStr (Now());
   MiItem.SubItems.Add(CategoriaToStr (aCategoria));
   MiItem.SubItems.Add (Texto);
   lsvMensajes.items.AddItem(MiItem);
 end;

end;

function CategoriaToStr (aCategoria :Categoria ):String ;
begin
 Result := 'No definida';
 { Type  Categoria = (General,Compilar,Editor);
 }
 Case aCategoria of
  General :
    Result := 'General';
  Compilador :
    Result := 'Compilar';
  Editor :
    Result := 'Editor';
 end;

end;




end.

